package cn.trigram.lang;


import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;
import org.apache.commons.lang3.StringUtils;

/**
 * 数字格式工具
 *
 * @version 1.0.0
 * @date 2022/08/02 14:17:20
 * @since 1.0.0
 */
public class NumberFormatUtil {
    public static String format(Object o, String pattern) {
        final DecimalFormat decimalFormat = new DecimalFormat(pattern, DecimalFormatSymbols.getInstance());
        decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
        return decimalFormat.format(o);
    }

    /**
     * 不能转换过大数值（Double的最大精度）。更大精度值的转换请直接使用{@link #parse(String)} 方法或者自行处理
     *
     * @param source
     * @param pattern
     * @return {@link BigDecimal }
     */
    public static BigDecimal parse(String source, String pattern) {
        try {
            final DecimalFormat decimalFormat = new DecimalFormat(pattern, DecimalFormatSymbols.getInstance());
            decimalFormat.setParseBigDecimal(true);
            decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
            return (BigDecimal) decimalFormat.parse(source);
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * 百分数、千分位和数学数值格式解析
     *
     * @param source
     * @return {@link BigDecimal }
     */
    public static BigDecimal parse(String source) {
        if (StringUtils.isBlank(source)) {
            return null;
        }
        if (source.endsWith("%")) {
            return new BigDecimal(source.replaceAll("%", ""))
                    .divide(BigMathUtil.HUNDRED, new MathContext(BigMathUtil.DEFAULT_PRECISION, BigMathUtil.DEFAULT_ROUNDING_MODE));
        } else {
            if (source.contains(",")) {
                source = source.replaceAll(",", "");
            }
            return new BigDecimal(source);
        }
    }

    /**
     * 元金额千分位格式，小数位两位，0保留
     *
     * @param o
     * @return {@link String }
     */
    public static String formatMoneyToThousandth(Object o) {
        return format(o, ",##0.00");
    }

    /**
     * 元金额格式，小数位两位，0保留
     *
     * @param o
     * @return {@link String }
     */
    public static String formatMoney(Object o) {
        return format(o, "#0.00");
    }

    /**
     * 万元千分位金额格式，小数位6位，0不保留
     *
     * @param o
     * @return {@link String }
     */
    public static String formatTenThousandMoneyToThousandth(Object o) {
        return format(o, ",##0.######");
    }

    /**
     * 万元金额格式，小数位6位，0不保留
     *
     * @param o
     * @return {@link String }
     */
    public static String formatTenThousandMoney(Object o) {
        return format(o, "#0.######");
    }

    /**
     * 格式为百分数，小数位两位，不保留0
     * <br/>
     * 例如：0.01->1%
     * <br/>
     * 注：数值会自动乘100。
     *
     * @param o
     * @return {@link String }
     */
    public static String formatPercentage(Object o) {
        return format(o, "#0.##%");
    }
}
